Add gtk_widget_get_native
authorMatthias Clasen <mclasen@redhat.com>
Thu, 2 May 2019 21:32:54 +0000 (17:32 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 28 May 2019 20:24:39 +0000 (20:24 +0000)
This is a common enough operation to deserve api.

docs/reference/gtk/gtk4-sections.txt
gtk/gtktypes.h
gtk/gtkwidget.c
gtk/gtkwidget.h

index e9af026182dfd1cd0cdefd637d8c78bd93b8de0d..835f17f26acc4521412af5f1411e19c28d5ff29d 100644 (file)
@@ -4445,6 +4445,7 @@ gtk_widget_set_sensitive
 gtk_widget_set_parent
 gtk_widget_get_toplevel
 gtk_widget_get_root
+gtk_widget_get_native
 gtk_widget_get_ancestor
 gtk_widget_is_ancestor
 gtk_widget_translate_coordinates
index 8a48c1c4c8f0a8706002178e42f56e15a45f4d48..2798bd1b02e4dcb71d5de267d8d0a9ce9c852c65 100644 (file)
@@ -39,6 +39,7 @@ typedef struct _GtkClipboard         GtkClipboard;
 typedef struct _GtkEventController     GtkEventController;
 typedef struct _GtkGesture             GtkGesture;
 typedef struct _GtkLayoutManager       GtkLayoutManager;
+typedef struct _GtkNative              GtkNative;
 typedef struct _GtkRequisition        GtkRequisition;
 typedef struct _GtkRoot               GtkRoot;
 typedef struct _GtkSelectionData       GtkSelectionData;
index 4f1d444cecb8e7d266122f911aa8a3361610228d..c2f26e170d79741b1220fe3019be57451ed5bd5a 100644 (file)
@@ -3652,8 +3652,18 @@ sync_widget_surface_transform (GtkWidget *widget)
     }
   else
     {
-      g_warning ("Could not compute surface transform");
-      surface_transform_data->cached_surface_transform_valid = FALSE;
+      GtkWidget *native = GTK_WIDGET (gtk_widget_get_native (widget));
+
+      if (gtk_widget_compute_transform (widget, native,
+                                        &surface_transform_data->cached_surface_transform))
+        {
+          surface_transform_data->cached_surface_transform_valid = TRUE;
+        }
+      else
+        {
+          g_warning ("Could not compute surface transform");
+          surface_transform_data->cached_surface_transform_valid = FALSE;
+        }
     }
 
   if (was_valid != surface_transform_data->cached_surface_transform_valid ||
@@ -6672,6 +6682,27 @@ gtk_widget_get_root (GtkWidget *widget)
   return _gtk_widget_get_root (widget);
 }
 
+/**
+ * gtk_widget_get_native:
+ * @widget: a #GtkWidget
+ *
+ * Returns the GtkNative widget that contains @widget,
+ * or %NULL if the widget is not contained inside a
+ * widget tree with a native ancestor.
+ *
+ * #GtkNative widgets will return themselves here.
+ *
+ * Returns: (transfer none) (nullable): the #GtkNative
+ *   widget of @widget, or %NULL
+ */
+GtkNative *
+gtk_widget_get_native (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+  return GTK_NATIVE (gtk_widget_get_ancestor (widget, GTK_TYPE_NATIVE));
+}
+
 static void
 gtk_widget_real_direction_changed (GtkWidget        *widget,
                                    GtkTextDirection  previous_direction)
index 11703a6922362ecbfd02ec012cadca36d3698e70..7e11a545d088a3970e586edb6b9aa1ebb23d1be3 100644 (file)
@@ -549,6 +549,9 @@ GtkWidget *           gtk_widget_get_parent             (GtkWidget    *widget);
 GDK_AVAILABLE_IN_ALL
 GtkRoot *             gtk_widget_get_root               (GtkWidget    *widget);
 
+GDK_AVAILABLE_IN_ALL
+GtkNative *           gtk_widget_get_native             (GtkWidget    *widget);
+
 GDK_AVAILABLE_IN_ALL
 void                  gtk_widget_set_child_visible      (GtkWidget    *widget,
                                                          gboolean      child_visible);